<?php
// This is a PLUGIN TEMPLATE.
// Copy this file to a new name like abc_myplugin.php.  Edit the code, then
// run this file at the command line to produce a plugin for distribution:
// $ php abc_myplugin.php > abc_myplugin-0.1.txt

// Plugin name is optional.  If unset, it will be extracted from the current
// file name. Uncomment and edit this line to override:
$plugin['name'] = 'msd_google_map';

// 0 = Plugin help is in Textile format, no raw HTML allowed (default).
// 1 = Plugin help is in raw HTML.  Not recommended.
# $plugin['allow_html_help'] = 1;

$plugin['version'] = '1.2';
$plugin['author'] = 'Matt Davis';
$plugin['author_uri'] = 'http://photographdaddy.com';
$plugin['description'] = 'Associate location information for an article.';

// Plugin load order:
// The default value of 5 would fit most plugins, while for instance comment spam evaluators or URL redirectors
// would probably want to run earlier (1...4) to prepare the environment for everything else that follows.
// Orders 6...9 should be considered for plugins which would work late. This order is user-overrideable.
$plugin['order'] = '5';

// Plugin 'type' defines where the plugin is loaded
// 0 = public       : only on the public side of the website (default)
// 1 = public+admin : on both the public and admin side
// 2 = library      : only when include_plugin() or require_plugin() is called
// 3 = admin        : only on the admin side
$plugin['type'] = '1';

if (!defined('txpinterface'))
        @include_once('zem_tpl.php');

##################
#
#	msd_google_map for Textpattern
#	version 1.2
#	by Matt Davis
#	http://photographdaddy.com
#
# 	Change Log
#	v0.2 - added geocoder to lookup addresses
#	v0.3 - added variables for custom fields to allow them to easily be changed.
#	v0.4 - added [+] and [-] buttons to label per request from candyman 
#	v1.0 - added preferences tab to allow easy update.
#		added ability to select large center column map or small left column map.
#		added various map control and type options.
#	v1.1 - added customizable Marker using mapiconmaker.js 
#	v1.2 - added preview of Marker.
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
###################

if (@txpinterface == 'admin')
{
  global $msd_googlemapsapikey, $msd_coord1, $msd_coord2, $msd_start, 
            $msd_mapplacement, $msd_mapType, $msd_control, $msd_zoom,
            $msd_marker_type, $msd_marker_width, $msd_marker_height,
            $msd_marker_primary_color, $msd_marker_stroke_color,
            $msd_marker_corner_color;
            
	if (!isset($msd_googlemapsapikey)) {
		$msd_googlemapsapikey = "API-KEY";
		$msd = safe_insert('txp_prefs', "name='msd_googlemapsapikey', val='$msd_googlemapsapikey', prefs_id='1'");
	}

	if (!isset($msd_coord1)) {
		$msd_coord1 = "custom-1";
		$msd = safe_insert('txp_prefs', "name='msd_coord1', val='$msd_coord1', prefs_id='1'");
	}

	if (!isset($msd_coord2)) {
		$msd_coord2 = "custom-2";
		$msd = safe_insert('txp_prefs', "name='msd_coord2', val='$msd_coord2', prefs_id='1'");
	}
	if (!isset($msd_start)) {
		$msd_start = "36.54494944148322,-121.8658447265625";
		$msd = safe_insert('txp_prefs', "name='msd_start', val='$msd_start', prefs_id='1'");
	}
	
		if (!isset($msd_mapplacement)) {
		$msd_mapplacement = 1;
		$msd = safe_insert('txp_prefs', "name='msd_mapplacement', val='$msd_mapplacement', prefs_id='1'");
	}
	if (!isset($msd_mapType)) {
		$msd_mapType = 0;
		$msd = safe_insert('txp_prefs', "name='msd_mapType', val='$msd_mapType', prefs_id='1'");
	}
	if (!isset($msd_control)) {
		$msd_control= 0;
		$msd = safe_insert('txp_prefs', "name='msd_control', val='$msd_control', prefs_id='1'");
	}
  	if (!isset($msd_zoom)) {
		$msd_zoom= 13;
		$msd = safe_insert('txp_prefs', "name='msd_zoom', val='$msd_zoom', prefs_id='1'");
	}
  
    	if (!isset($msd_marker_type)) {
		$msd_marker_type= 0;
		$msd = safe_insert('txp_prefs', "name='msd_marker_type', val='$msd_marker_type', prefs_id='1'");
	}  	if (!isset($msd_marker_width)) {
		$msd_marker_width= 32;
		$msd = safe_insert('txp_prefs', "name='msd_marker_width', val='$msd_marker_width', prefs_id='1'");
	}  	if (!isset($msd_marker_height)) {
		$msd_marker_height= 32;
		$msd = safe_insert('txp_prefs', "name='msd_marker_height', val='$msd_marker_height', prefs_id='1'");
	}  	if (!isset($msd_marker_primary_color)) {
		$msd_marker_primary_color= '#FF0000';
		$msd = safe_insert('txp_prefs', "name='msd_marker_primary_color', val='$msd_marker_primary_color', prefs_id='1'");
	}  	if (!isset($msd_marker_stroke_color)) {
		$msd_marker_stroke_color= '#000000';
		$msd = safe_insert('txp_prefs', "name='msd_marker_stroke_color', val='$msd_marker_stroke_color', prefs_id='1'");
	}  	if (!isset($msd_marker_corner_color)) {
		$msd_marker_corner_color= '#FFFFFF';
		$msd = safe_insert('txp_prefs', "name='msd_marker_corner_color', val='$msd_marker_corner_color', prefs_id='1'");
	}

	
	// 'msd_google_map_setup' will be called to handle the 'msd_google_map' event
	register_callback("msd_google_map_setup", "msd_google_map");

	register_callback('msd_google_map_admin', 'article');
	ob_start('msd_google_map_admin');
	add_privs('msd_google_map', 1);
	register_tab("extensions", "msd_google_map", "Article Location");
	}else{
if(gps('msd_google_map_js')) msd_google_map_js(gps('msd_google_map_js'));
}


	function msd_google_map_admin($buffer)
{
		global $msd_googlemapsapikey, $msd_coord1, $msd_coord2, $msd_start, 
            $msd_mapplacement, $msd_mapType, $msd_control, $msd_zoom,
            $msd_marker_type, $msd_marker_width, $msd_marker_height,
            $msd_marker_primary_color, $msd_marker_stroke_color,
            $msd_marker_corner_color;
            
if ($msd_googlemapsapikey!="API-KEY" && $msd_googlemapsapikey!=""){
$find = '</head>';
$replace='<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&key='.$msd_googlemapsapikey.'">'."\n";
//$replace.='var apiKey = "'.$msd_googlemapsapikey.'";'."\n";
//$replace.='var customField1 = "'.$msd_coord1.'";'."\n";
//$replace.='var customField2 = "'.$msd_coord1.'";'."\n";
//$replace.='var startPoint = "'.$msd_start.'";'."\n";
//$replace.='var mapType = "'.$msd_mapType.'";'."\n";
$replace.='</script>'."\n";
$replace.='<script type="text/JavaScript" src="'.hu.'?msd_google_map_js=mapiconmaker_packedjs"></script>'."\n";


$new = str_replace($find, $replace.$find, $buffer);
if ($msd_mapplacement == 1){
$find2 = '<p><label for="body">';
}else{
$find2 = '<p><label for="keywords">'; //sideb ar
}
$replace2='<p id="msd_google_map"><label for="map">'.gTxt("Map").'[+]</label><br /><div id="map_container"><div id="map" style="width:500px;height:230px;padding:0px;margin:0px;text-align:left;"></div></p>'."\n";
$replace2.='<p><label>Address Lookup</label><br />'."\n";
$replace2.='<input id="address" type="text" size="60" name="address" class="edit"/>'."\n";
$replace2.='<input type="button" value="Lookup" onclick="showAddress();"/>'."\n";
$replace2.='</p></div>'."\n";
$replace2.='<script type="text/javascript">'."\n";
$replace2.='//<![CDATA['."\n";
$replace2.='$("#msd_google_map").click(function () {'."\n";
$replace2.='$("#map_container").toggle();'."\n";
$replace2.='if ($("#msd_google_map").text()=="Map[+]"){'."\n";
$replace2.='$("#msd_google_map").text("Map[-]");'."\n";
$replace2.='}else{'."\n";
$replace2.='$("#msd_google_map").text("Map[+]");'."\n";
$replace2.='}'."\n";
$replace2.='});'."\n";
$replace2.='$("#map_container").hide();'."\n";
if ($msd_mapplacement == 1){
$replace2.='var map = new GMap2(document.getElementById("map"),  { size: new GSize(500,230) } );'."\n";
}else{
$replace2.='var map = new GMap2(document.getElementById("map"),  { size: new GSize(160,130) } );'."\n";
}
if ($msd_mapType==1){
$replace2.='map.setMapType(G_SATELLITE_MAP);'."\n";
}else if ($msd_mapType==2){
$replace2.='map.setMapType(G_HYBRID_MAP);'."\n";
}else{
$replace2.='map.setMapType(G_NORMAL_MAP);'."\n";
}
//ICON
$replace2.='var iconOptions = {'."\n";
$replace2.='width: "32",'."\n";
$replace2.='height: "32",'."\n";
$replace2.='primaryColor: "ff0000",'."\n";
$replace2.='cornerColor: "ffffff",'."\n";
$replace2.='strokeColor: "000000"'."\n";
$replace2.='};'."\n";
$replace2.='iconOptions.width = "'.$msd_marker_width.'";'."\n";
$replace2.='iconOptions.height = "'.$msd_marker_height.'";'."\n";
$replace2.='iconOptions.primaryColor = "'.$msd_marker_primary_color.'";'."\n";
$replace2.='iconOptions.cornerColor = "'.$msd_marker_corner_color.'";'."\n";
$replace2.='iconOptions.strokeColor = "'.$msd_marker_stroke_color.'";'."\n";
$replace2.='var icon = MapIconMaker.createMarkerIcon(iconOptions);'."\n";

$replace2.='var mypoint;'."\n";
$replace2.='var myMarker;'."\n";
$replace2.='var geocoder = null;'."\n";
$replace2.='geocoder = new GClientGeocoder();'."\n";
$replace2.='if (document.getElementById("'.$msd_coord1.'").value!==""  && document.getElementById("'.$msd_coord2.'").value!=="" ){'."\n";
$replace2.='x = document.getElementById("'.$msd_coord1.'").value;'."\n";
$replace2.='y = document.getElementById("'.$msd_coord2.'").value;'."\n";
$replace2.='map.setCenter(new GLatLng(x,y), 1);'."\n";
$replace2.='mypoint= new GLatLng(x,y);'."\n";
$replace2.='}else{'."\n";
$replace2.='mypoint = new GLatLng('.$msd_start.');'."\n";
$replace2.='map.setCenter(mypoint,1);'."\n";
$replace2.='}'."\n";
$replace2.='mymarker = new GMarker(mypoint, {icon: icon});'."\n";
$replace2.='map.addOverlay(mymarker);'."\n";
if ($msd_control==1){//"GSmallMapControl","GSmallZoomControl","GSmallZoomControl3D"
$replace2.='map.addControl(new GSmallZoomControl());'."\n";
}else if ($msd_control==2){
$replace2.='map.addControl(new GSmallZoomControl3D());'."\n";
}else{
$replace2.='map.addControl(new GSmallMapControl());'."\n";
}
$replace2.='GEvent.addListener(map,"click", function(overlay, point) {'."\n";
$replace2.='if (overlay) {'."\n";
$replace2.='map.removeOverlay(overlay);'."\n";
$replace2.='} else if (point) {'."\n";
$replace2.='map.panTo(point);'."\n";
$replace2.='mymarker.setLatLng(point);'."\n";
$replace2.='map.addOverlay(mymarker);'."\n";
$replace2.='}'."\n";
$replace2.='});'."\n";
$replace2.='GEvent.addListener(map,"click", function(overlay, latlng) {'."\n";
$replace2.='if (latlng) {'."\n";
$replace2.='document.getElementById("'.$msd_coord1.'").value=latlng.lat();'."\n";
$replace2.='document.getElementById("'.$msd_coord2.'").value=latlng.lng();'."\n";
$replace2.='}'."\n";
$replace2.='});'."\n";
$replace2.=''."\n";
$replace2.='function showAddress() {'."\n";
$replace2.='var address=document.getElementById("address").value;'."\n";
$replace2.='if (geocoder) {'."\n";
$replace2.='geocoder.getLatLng('."\n";
$replace2.='address,'."\n";
$replace2.='function(point) {'."\n";
$replace2.='if (!point) {'."\n";
$replace2.='alert(address + " not found");'."\n";
$replace2.='} else {'."\n";
$replace2.='map.setCenter(point, '.$msd_zoom.');'."\n";
$replace2.='//var marker = new GMarker(point);'."\n";
$replace2.='mymarker.setLatLng(point);'."\n";
$replace2.='//map.addOverlay(marker);'."\n";
$replace2.='document.getElementById("'.$msd_coord1.'").value=point.lat();'."\n";
$replace2.='document.getElementById("'.$msd_coord2.'").value=point.lng();'."\n";
$replace2.=''."\n";
$replace2.='}'."\n";
$replace2.='}'."\n";
$replace2.=');'."\n";
$replace2.='}'."\n";
$replace2.='}'."\n";
$replace2.='//]]>'."\n";
$replace2.='</script>'."\n";
}else{
$find = '<td id="messagepane">';
$replace='msd_google_map: Google Maps API Key is not set.'."\n";
return str_replace($find, $find.$replace, $buffer);

}


return str_replace($find2, $replace2.$find2, $new);
}

function msd_google_map_setup($event, $step) {
    global $msd_googlemapsapikey, $msd_coord1, $msd_coord2, $msd_start, 
            $msd_mapplacement, $msd_mapType, $msd_control, $msd_zoom,
            $msd_marker_type, $msd_marker_width, $msd_marker_height,
            $msd_marker_primary_color, $msd_marker_stroke_color,
            $msd_marker_corner_color;

	include(txpath . '/include/txp_prefs.php');

  if (ps("save")) {
	prefs_save();
	header("Location: index.php?event=msd_google_map");
  }

  pagetop("Article Location Preferences");
$msd_mapTypes = array(gTxt("Normal"),gTxt("Satelitte"),gTxt("Hybrid"));
$msd_controls = array(gTxt("Zoom and Pan"),gTxt("Basic Zoom"),gTxt("3D-style Zoom"));
$msd_zooms = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);

	echo <<<EOF
<script type="text/javascript" src="/?msd_google_map_js=colorselectorjs"></script>
<script type="text/javascript">
var iconOptions = {


EOF;
echo '  width: "'.$msd_marker_width.'",';
echo '  height: "'.$msd_marker_height.'",';
echo '  primaryColor: "'.$msd_marker_primary_color.'",';
echo '  cornerColor: "'.$msd_marker_corner_color.'",';
echo '  strokeColor: "'.$msd_marker_stroke_color.'"';
echo <<<EOF
};
 $(document).ready(function() {
   // do stuff when DOM is ready
   load();
   //alert('hi');
   $("#map").hide();
   $("#msd_marker_primary_color","#msd_marker_stroke_color","#msd_marker_corner_color").change(updateImage);
 });
var map = null;
function changeColor(colorHex) {
  iconOptions.primaryColor = colorHex;
  updateImage();
}
 
function changeCornerColor(colorHex) {
  iconOptions.cornerColor = colorHex;
  updateImage();
}
function updateImage() {
//alert('updateImage');
  map.clearOverlays();
  iconOptions.width = document.getElementById("msd_marker_width").value;
  iconOptions.height = document.getElementById("msd_marker_height").value;
  iconOptions.primaryColor = document.getElementById("msd_marker_primary_color").value + "FF";
  iconOptions.cornerColor = document.getElementById("msd_marker_stroke_color").value + "FF";
  iconOptions.strokeColor = document.getElementById("msd_marker_corner_color").value + "FF";
  var icon = MapIconMaker.createMarkerIcon(iconOptions);
 
  // Make an image from the foreground of the marker
  document.getElementById("marker").innerHTML = "";
  var img = document.createElement("img");
  img.setAttribute("src", icon.image);
  document.getElementById("marker").appendChild(img);
  point= new GLatLng(37.4419, -122.1419);
  map.addOverlay(createMarker(point, icon));
 }
 function createMarker(point, icon) {
  var marker = new GMarker(point, {icon: icon, draggable:true});
  return marker;
}
 function load() {
 //alert('loading');
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    //map.addControl(new GSmallMapControl());
    //map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(37.4419, -122.1419), 13);
    updateImage();
	$("#map").hide();
  }
}

</script>
EOF;
  //echo '<div id="marker" style="height: 50px"></div> ';

  echo form(startTable("list").
  tr(tdcs(hed(gTxt("Article Locations Preferences"),1),2)).
  tr(tdcs(hed(gTxt("Set API Key, ID of custom fields used for associating lat/lng with articles and other map settings."),4),2)).
  tr(tda(gTxt("Display Large Map?"), ' style="text-align:right;vertical-align:middle"').td(yesnoradio("msd_mapplacement",$msd_mapplacement))).
  tr(tda(href(gTxt("Google Map API Key"), "http://code.google.com/apis/maps/signup.html"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_googlemapsapikey",$msd_googlemapsapikey))).
  tr(tda(gTxt("ID of Latitude Custom Field"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_coord1",$msd_coord1,'20'))).
  tr(tda(gTxt("ID of Longitude Custom Field"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_coord2",$msd_coord2,'20'))).
  tr(tda(gTxt("Starting Coordinates"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_start",$msd_start,'20'))).
  tr(tda(href(gTxt("Map Type"),"http://code.google.com/apis/maps/documentation/reference.html#GMapType.G_NORMAL_MAP"), ' style="text-align:right;vertical-align:middle"').td(selectInput("msd_mapType",$msd_mapTypes,$msd_mapType))).  
  tr(tda(href(gTxt("Control Type"),"http://code.google.com/apis/maps/documentation/reference.html#GControlImpl.GSmallMapControl"), ' style="text-align:right;vertical-align:middle"').td(selectInput("msd_control",$msd_controls,$msd_control))).    
 tr(tda(gTxt("Zoom Level"), ' style="text-align:right;vertical-align:middle"').td(selectInput("msd_zoom",$msd_zooms,$msd_zoom))).    
  //icon
  tr(tda(gTxt("Marker Width"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_marker_width",$msd_marker_width,3))).    
  tr(tda(gTxt("Marker Height"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_marker_height",$msd_marker_height,3))).    
//TODO - If color input fields had class of "color" colorselectorjs would work.  For now it doesn't.
  tr(tda(gTxt("Marker Primary Color"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_marker_primary_color",$msd_marker_primary_color,7))).    
  tr(tda(gTxt("Marker Stroke Color"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_marker_stroke_color",$msd_marker_stroke_color,7))).    
  tr(tda(gTxt("Marker Corner Color"), ' style="text-align:right;vertical-align:middle"').td(text_input("msd_marker_corner_color",$msd_marker_corner_color,7))).    
  tr(tda(gTxt("Marker Preview"), ' id="marker" style="text-align:right;vertical-align:middle"').td("Marker Preview")).    
  tr(tda(fInput("submit","save",gTxt("save_button"),"publish").eInput("msd_google_map").sInput('saveprefs'), " colspan=\"2\" class=\"noline\"")).
  endTable());
echo '<div id="map" style="width: 0px; height: 0px"></div>';  
}
//Serve the mapiconmaker_packed.js file
function msd_google_map_js($file=''){
		ob_start();
		ob_end_clean();
				switch($file) {
			case 'hpng' :
			header('Content-type: image/png');
			$code = 'iVBORw0KGgoAAAANSUhEUgAAACMAAADICAIAAADtOM9PAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gMXAjE1EbdXmwAAAQlJREFUeNrtmlEOgkAMRBupy+L9
7wqsgnICPtSM7uR5gZfHTBtKzGeIfhmjjFQNnSZywsmeRPdwYp7ICaf+3yMcnx7dw+lH87SlirQX
FWmRXZ9r+Dk5klYaAYkdgdMJaWYb0T2cmNwTUqN7dM8+py2uqptQRgrV8X6QqqHTRE40gu7RCPYe
OeFk1r3CPNE95qk/p12Wk+r8zGgy0gKpi0Y4Os3khBNOzBPdw+kPSbp5anSP7rnndLmrSIOMpPo7
bGQNP6cpyOl9UiEnnOx3hKPTzdBppHs42e/yyjzx9HiP+N5NqPr0kUM8VBe16ng/SKuh00JOH5Bm
GanRCLqHEyS6hxPzRE44+ZJeueFsJ8zY3KsAAAAASUVORK5CYII=';
			break;
			case 'crosshairspng' :
			header('Content-type: image/png');
			$code = 'iVBORw0KGgoAAAANSUhEUgAAABUAAAAVAgMAAADUeU0FAAAACVBMVEUAAPD///8AAAAXuLmoAAAA
AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfWAxYA
MBoYReiIAAAAHXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBUaGUgR0lNUO9kJW4AAAAhSURBVAiZ
Y2RgULvFwMBILrWK4Q8LwzXGUBD1GsajzEwAP/oZVvc4N8oAAAAASUVORK5CYII=';			
			break;
			case 'positionpng' :
			header('Content-type: image/png');
			$code = 'iVBORw0KGgoAAAANSUhEUgAAACMAAAALCAQAAABfL/yJAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA
CxMAAAsTAQCanBgAAAAHdElNRQfWAxYPFQ14OfqVAAAAnElEQVQoz63Suw2EMAwGYJ9Ss0BaBkCs
AYtki6uRmAM2yRwREh0SgchURj/Nne5o7oEsV3bx2bJNI7hBBrocGTcjqEW/cRQHc4Ew4jj2Wwu6
gVDCpzWg+hOp1uBTCcId9KzVCCl6FD8SRfQh1Y/kjSEYuH3mpYP9Qtilm9ntry2cGALBYhCZkH9A
cpkGOXfSn0ZhNyqXUvkbnS8+AP2Frl9tNFLoAAAAAElFTkSuQmCC';			
			break;
			case 'svpng' :
			header('Content-type: image/png');
			$code = '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';
			break;
			case 'colorselectorjs' : 
			header('Content-type: text/JavaScript');
			$code = 'Ly8gQSBmZXcgY29uZmlndXJhdGlvbiBzZXR0aW5ncw0KdmFyIENST1NTSEFJUlNfTE9DQVRJT04g
PSAnLz9tc2RfZ29vZ2xlX21hcF9qcz1jcm9zc2hhaXJzcG5nJzsNCnZhciBIVUVfU0xJREVSX0xP
Q0FUSU9OID0gJy8/bXNkX2dvb2dsZV9tYXBfanM9aHBuZyc7DQp2YXIgSFVFX1NMSURFUl9BUlJP
V1NfTE9DQVRJT04gPSAnLz9tc2RfZ29vZ2xlX21hcF9qcz1wb3NpdGlvbnBuZyc7DQp2YXIgU0FU
X1ZBTF9TUVVBUkVfTE9DQVRJT04gPSAnL21zZF9nb29nbGVfbWFwX2pzP3N2cG5nJzsNCg0KLy8g
SGVyZSBhcmUgc29tZSBib3JpbmcgdXRpbGl0eSBmdW5jdGlvbnMuIFRoZSByZWFsIGNvZGUgY29t
ZXMgbGF0ZXIuDQoNCmZ1bmN0aW9uIGhleFRvUmdiKGhleF9zdHJpbmcsIGRlZmF1bHRfKQ0Kew0K
ICAgIGlmIChkZWZhdWx0XyA9PSB1bmRlZmluZWQpDQogICAgew0KICAgICAgICBkZWZhdWx0XyA9
IG51bGw7DQogICAgfQ0KDQogICAgaWYgKGhleF9zdHJpbmcuc3Vic3RyKDAsIDEpID09ICcjJykN
CiAgICB7DQogICAgICAgIGhleF9zdHJpbmcgPSBoZXhfc3RyaW5nLnN1YnN0cigxKTsNCiAgICB9
DQogICAgDQogICAgdmFyIHI7DQogICAgdmFyIGc7DQogICAgdmFyIGI7DQogICAgaWYgKGhleF9z
dHJpbmcubGVuZ3RoID09IDMpDQogICAgew0KICAgICAgICByID0gaGV4X3N0cmluZy5zdWJzdHIo
MCwgMSk7DQogICAgICAgIHIgKz0gcjsNCiAgICAgICAgZyA9IGhleF9zdHJpbmcuc3Vic3RyKDEs
IDEpOw0KICAgICAgICBnICs9IGc7DQogICAgICAgIGIgPSBoZXhfc3RyaW5nLnN1YnN0cigyLCAx
KTsNCiAgICAgICAgYiArPSBiOw0KICAgIH0NCiAgICBlbHNlIGlmIChoZXhfc3RyaW5nLmxlbmd0
aCA9PSA2KQ0KICAgIHsNCiAgICAgICAgciA9IGhleF9zdHJpbmcuc3Vic3RyKDAsIDIpOw0KICAg
ICAgICBnID0gaGV4X3N0cmluZy5zdWJzdHIoMiwgMik7DQogICAgICAgIGIgPSBoZXhfc3RyaW5n
LnN1YnN0cig0LCAyKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIGRl
ZmF1bHRfOw0KICAgIH0NCiAgICANCiAgICByID0gcGFyc2VJbnQociwgMTYpOw0KICAgIGcgPSBw
YXJzZUludChnLCAxNik7DQogICAgYiA9IHBhcnNlSW50KGIsIDE2KTsNCiAgICBpZiAoaXNOYU4o
cikgfHwgaXNOYU4oZykgfHwgaXNOYU4oYikpDQogICAgew0KICAgICAgICByZXR1cm4gZGVmYXVs
dF87DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybiB7cjogciAvIDI1NSwg
ZzogZyAvIDI1NSwgYjogYiAvIDI1NX07DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZ2JUb0hleChy
LCBnLCBiLCBpbmNsdWRlSGFzaCkNCnsNCiAgICByID0gTWF0aC5yb3VuZChyICogMjU1KTsNCiAg
ICBnID0gTWF0aC5yb3VuZChnICogMjU1KTsNCiAgICBiID0gTWF0aC5yb3VuZChiICogMjU1KTsN
CiAgICBpZiAoaW5jbHVkZUhhc2ggPT0gdW5kZWZpbmVkKQ0KICAgIHsNCiAgICAgICAgaW5jbHVk
ZUhhc2ggPSB0cnVlOw0KICAgIH0NCiAgICANCiAgICByID0gci50b1N0cmluZygxNik7DQogICAg
aWYgKHIubGVuZ3RoID09IDEpDQogICAgew0KICAgICAgICByID0gJzAnICsgcjsNCiAgICB9DQog
ICAgZyA9IGcudG9TdHJpbmcoMTYpOw0KICAgIGlmIChnLmxlbmd0aCA9PSAxKQ0KICAgIHsNCiAg
ICAgICAgZyA9ICcwJyArIGc7DQogICAgfQ0KICAgIGIgPSBiLnRvU3RyaW5nKDE2KTsNCiAgICBp
ZiAoYi5sZW5ndGggPT0gMSkNCiAgICB7DQogICAgICAgIGIgPSAnMCcgKyBiOw0KICAgIH0NCiAg
ICByZXR1cm4gKChpbmNsdWRlSGFzaCA/ICcjJyA6ICcnKSArIHIgKyBnICsgYikudG9VcHBlckNh
c2UoKTsNCn0NCg0KdmFyIGFyVmVyc2lvbiA9IG5hdmlnYXRvci5hcHBWZXJzaW9uLnNwbGl0KCJN
U0lFIik7DQp2YXIgdmVyc2lvbiA9IHBhcnNlRmxvYXQoYXJWZXJzaW9uWzFdKTsNCg0KZnVuY3Rp
b24gZml4UE5HKG15SW1hZ2UpDQp7DQogICAgaWYgKCh2ZXJzaW9uID49IDUuNSkgJiYgKHZlcnNp
b24gPCA3KSAmJiAoZG9jdW1lbnQuYm9keS5maWx0ZXJzKSkgDQogICAgew0KICAgICAgICB2YXIg
bm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgbm9kZS5pZCA9
IG15SW1hZ2UuaWQ7DQogICAgICAgIG5vZGUuY2xhc3NOYW1lID0gbXlJbWFnZS5jbGFzc05hbWU7
DQogICAgICAgIG5vZGUudGl0bGUgPSBteUltYWdlLnRpdGxlOw0KICAgICAgICBub2RlLnN0eWxl
LmNzc1RleHQgPSBteUltYWdlLnN0eWxlLmNzc1RleHQ7DQogICAgICAgIG5vZGUuc3R5bGUuc2V0
QXR0cmlidXRlKCdmaWx0ZXInLCAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFs
cGhhSW1hZ2VMb2FkZXIiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KyAiKHNyYz1cJyIgKyBteUltYWdlLnNyYyArICJcJywgc2l6aW5nTWV0aG9kPSdzY2FsZScpIik7
DQogICAgICAgIG5vZGUuc3R5bGUuZm9udFNpemUgPSAnMCc7DQogICAgICAgIG5vZGUuc3R5bGUu
d2lkdGggPSBteUltYWdlLndpZHRoLnRvU3RyaW5nKCkgKyAncHgnOw0KICAgICAgICBub2RlLnN0
eWxlLmhlaWdodCA9IG15SW1hZ2UuaGVpZ2h0LnRvU3RyaW5nKCkgKyAncHgnOw0KICAgICAgICBu
b2RlLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsNCiAgICAgICAgcmV0dXJuIG5vZGU7
DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybiBteUltYWdlLmNsb25lTm9k
ZShmYWxzZSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiB0cmFja0RyYWcobm9kZSwgaGFuZGxlcikN
CnsNCiAgICBmdW5jdGlvbiBmaXhDb29yZHMoeCwgeSkNCiAgICB7DQogICAgICAgIHZhciBub2Rl
UGFnZUNvb3JkcyA9IHBhZ2VDb29yZHMobm9kZSk7DQogICAgICAgIHggPSAoeCAtIG5vZGVQYWdl
Q29vcmRzLngpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7DQogICAgICAg
IHkgPSAoeSAtIG5vZGVQYWdlQ29vcmRzLnkpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNj
cm9sbFRvcDsNCiAgICAgICAgaWYgKHggPCAwKSB4ID0gMDsNCiAgICAgICAgaWYgKHkgPCAwKSB5
ID0gMDsNCiAgICAgICAgaWYgKHggPiBub2RlLm9mZnNldFdpZHRoIC0gMSkgeCA9IG5vZGUub2Zm
c2V0V2lkdGggLSAxOw0KICAgICAgICBpZiAoeSA+IG5vZGUub2Zmc2V0SGVpZ2h0IC0gMSkgeSA9
IG5vZGUub2Zmc2V0SGVpZ2h0IC0gMTsNCiAgICAgICAgcmV0dXJuIHt4OiB4LCB5OiB5fTsNCiAg
ICB9DQogICAgZnVuY3Rpb24gbW91c2VEb3duKGV2KQ0KICAgIHsNCiAgICAgICAgdmFyIGNvb3Jk
cyA9IGZpeENvb3Jkcyhldi5jbGllbnRYLCBldi5jbGllbnRZKTsNCiAgICAgICAgdmFyIGxhc3RY
ID0gY29vcmRzLng7DQogICAgICAgIHZhciBsYXN0WSA9IGNvb3Jkcy55Ow0KICAgICAgICBoYW5k
bGVyKGNvb3Jkcy54LCBjb29yZHMueSk7DQoNCiAgICAgICAgZnVuY3Rpb24gbW92ZUhhbmRsZXIo
ZXYpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjb29yZHMgPSBmaXhDb29yZHMoZXYuY2xp
ZW50WCwgZXYuY2xpZW50WSk7DQogICAgICAgICAgICBpZiAoY29vcmRzLnggIT0gbGFzdFggfHwg
Y29vcmRzLnkgIT0gbGFzdFkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgbGFzdFgg
PSBjb29yZHMueDsNCiAgICAgICAgICAgICAgICBsYXN0WSA9IGNvb3Jkcy55Ow0KICAgICAgICAg
ICAgICAgIGhhbmRsZXIoY29vcmRzLngsIGNvb3Jkcy55KTsNCiAgICAgICAgICAgIH0NCiAgICAg
ICAgfQ0KICAgICAgICBmdW5jdGlvbiB1cEhhbmRsZXIoZXYpDQogICAgICAgIHsNCiAgICAgICAg
ICAgIG15UmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgJ21vdXNldXAnLCB1cEhhbmRsZXIp
Ow0KICAgICAgICAgICAgbXlSZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCAnbW91c2Vtb3Zl
JywgbW92ZUhhbmRsZXIpOw0KICAgICAgICAgICAgbXlBZGRFdmVudExpc3RlbmVyKG5vZGUsICdt
b3VzZWRvd24nLCBtb3VzZURvd24pOw0KICAgICAgICB9DQogICAgICAgIG15QWRkRXZlbnRMaXN0
ZW5lcihkb2N1bWVudCwgJ21vdXNldXAnLCB1cEhhbmRsZXIpOw0KICAgICAgICBteUFkZEV2ZW50
TGlzdGVuZXIoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCBtb3ZlSGFuZGxlcik7DQogICAgICAgIG15
UmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCAnbW91c2Vkb3duJywgbW91c2VEb3duKTsNCiAgICAg
ICAgaWYgKGV2LnByZXZlbnREZWZhdWx0KSBldi5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIH0NCiAg
ICBteUFkZEV2ZW50TGlzdGVuZXIobm9kZSwgJ21vdXNlZG93bicsIG1vdXNlRG93bik7DQogICAg
bm9kZS5vbm1vdXNlZG93biA9IGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGZhbHNlOyB9Ow0KICAgIG5v
ZGUub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGZhbHNlOyB9Ow0KICAgIG5v
ZGUub25kcmFnc3RhcnQgPSBmdW5jdGlvbihlKSB7IHJldHVybiBmYWxzZTsgfTsNCn0NCg0KdmFy
IGV2ZW50TGlzdGVuZXJzID0gW107DQoNCmZ1bmN0aW9uIGZpbmRFdmVudExpc3RlbmVyKG5vZGUs
IGV2ZW50LCBoYW5kbGVyKQ0Kew0KICAgIHZhciBpOw0KICAgIGZvciAoaSBpbiBldmVudExpc3Rl
bmVycykNCiAgICB7DQogICAgICAgIGlmIChldmVudExpc3RlbmVyc1tpXS5ub2RlID09IG5vZGUg
JiYgZXZlbnRMaXN0ZW5lcnNbaV0uZXZlbnQgPT0gZXZlbnQNCiAgICAgICAgICYmIGV2ZW50TGlz
dGVuZXJzW2ldLmhhbmRsZXIgPT0gaGFuZGxlcikNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0
dXJuIGk7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIG51bGw7DQp9DQpmdW5jdGlvbiBt
eUFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnQsIGhhbmRsZXIpDQp7DQogICAgaWYgKGZpbmRF
dmVudExpc3RlbmVyKG5vZGUsIGV2ZW50LCBoYW5kbGVyKSAhPSBudWxsKQ0KICAgIHsNCiAgICAg
ICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmICghbm9kZS5hZGRFdmVudExpc3RlbmVyKQ0KICAg
IHsNCiAgICAgICAgbm9kZS5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpOw0KICAg
IH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQs
IGhhbmRsZXIsIGZhbHNlKTsNCiAgICB9DQoNCiAgICBldmVudExpc3RlbmVycy5wdXNoKHtub2Rl
OiBub2RlLCBldmVudDogZXZlbnQsIGhhbmRsZXI6IGhhbmRsZXJ9KTsNCn0NCg0KZnVuY3Rpb24g
cmVtb3ZlRXZlbnRMaXN0ZW5lckluZGV4KGluZGV4KQ0Kew0KICAgIHZhciBldmVudExpc3RlbmVy
ID0gZXZlbnRMaXN0ZW5lcnNbaW5kZXhdOw0KICAgIGRlbGV0ZSBldmVudExpc3RlbmVyc1tpbmRl
eF07DQogICAgDQogICAgaWYgKCFldmVudExpc3RlbmVyLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5l
cikNCiAgICB7DQogICAgICAgIGV2ZW50TGlzdGVuZXIubm9kZS5kZXRhY2hFdmVudCgnb24nICsg
ZXZlbnRMaXN0ZW5lci5ldmVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGV2ZW50TGlzdGVuZXIuaGFuZGxlcik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAg
ICAgIGV2ZW50TGlzdGVuZXIubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TGlzdGVuZXIu
ZXZlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2
ZW50TGlzdGVuZXIuaGFuZGxlciwgZmFsc2UpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gbXlSZW1v
dmVFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50LCBoYW5kbGVyKQ0Kew0KICAgIHJlbW92ZUV2ZW50
TGlzdGVuZXJJbmRleChmaW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudCwgaGFuZGxlcikpOw0K
fQ0KDQpmdW5jdGlvbiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnMoKQ0Kew0KICAgIHZhciBpOw0KICAg
IGZvciAoaSA9IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSA+IDA7IGktLSkNCiAgICB7DQogICAg
ICAgIGlmIChldmVudExpc3RlbmVyc1tpXSAhPSB1bmRlZmluZWQpDQogICAgICAgIHsNCiAgICAg
ICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbmRleChpKTsNCiAgICAgICAgfQ0KICAgIH0NCn0N
Cm15QWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICd1bmxvYWQnLCBjbGVhbnVwRXZlbnRMaXN0ZW5l
cnMpOw0KDQovLyBUaGlzIGNvcHlyaWdodCBzdGF0ZW1lbnQgYXBwbGllcyB0byB0aGUgZm9sbG93
aW5nIHR3byBmdW5jdGlvbnMsDQovLyB3aGljaCBhcmUgdGFrZW4gZnJvbSBNb2NoaUtpdC4NCi8v
DQovLyBDb3B5cmlnaHQgMjAwNSBCb2IgSXBwb2xpdG8gPGJvYkByZWRpdmkuY29tPg0KLy8NCi8v
IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy
c29uIG9idGFpbmluZw0KLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQg
ZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlDQovLyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUg
U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQovLyB3aXRob3V0IGxpbWl0
YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsDQov
LyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3
YXJlLCBhbmQgdG8NCi8vIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1
cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdA0KLy8gdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Og0KLy8NCi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g
bm90aWNlIHNoYWxsIGJlDQovLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFs
IHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCi8vIA0KLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJ
REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQovLyBFWFBSRVNTIE9S
IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YN
Ci8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E
DQovLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENP
UFlSSUdIVCBIT0xERVJTDQovLyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBP
VEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4NCi8vIEFDVElPTiBPRiBDT05UUkFDVCwgVE9S
VCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElODQovLyBDT05ORUNUSU9O
IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNP
RlRXQVJFLg0KDQpmdW5jdGlvbiBoc3ZUb1JnYihodWUsIHNhdHVyYXRpb24sIHZhbHVlKQ0Kew0K
ICAgIHZhciByZWQ7DQogICAgdmFyIGdyZWVuOw0KICAgIHZhciBibHVlOw0KICAgIGlmICh2YWx1
ZSA9PSAwLjApDQogICAgew0KICAgICAgICByZWQgPSAwOw0KICAgICAgICBncmVlbiA9IDA7DQog
ICAgICAgIGJsdWUgPSAwOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB2YXIgaSA9
IE1hdGguZmxvb3IoaHVlICogNik7DQogICAgICAgIHZhciBmID0gKGh1ZSAqIDYpIC0gaTsNCiAg
ICAgICAgdmFyIHAgPSB2YWx1ZSAqICgxIC0gc2F0dXJhdGlvbik7DQogICAgICAgIHZhciBxID0g
dmFsdWUgKiAoMSAtIChzYXR1cmF0aW9uICogZikpOw0KICAgICAgICB2YXIgdCA9IHZhbHVlICog
KDEgLSAoc2F0dXJhdGlvbiAqICgxIC0gZikpKTsNCiAgICAgICAgc3dpdGNoIChpKQ0KICAgICAg
ICB7DQogICAgICAgICAgICBjYXNlIDE6IHJlZCA9IHE7IGdyZWVuID0gdmFsdWU7IGJsdWUgPSBw
OyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgMjogcmVkID0gcDsgZ3JlZW4gPSB2YWx1ZTsgYmx1
ZSA9IHQ7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAzOiByZWQgPSBwOyBncmVlbiA9IHE7IGJs
dWUgPSB2YWx1ZTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDQ6IHJlZCA9IHQ7IGdyZWVuID0g
cDsgYmx1ZSA9IHZhbHVlOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgNTogcmVkID0gdmFsdWU7
IGdyZWVuID0gcDsgYmx1ZSA9IHE7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSA2OiAvLyBmYWxs
IHRocm91Z2gNCiAgICAgICAgICAgIGNhc2UgMDogcmVkID0gdmFsdWU7IGdyZWVuID0gdDsgYmx1
ZSA9IHA7IGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiB7cjogcmVkLCBnOiBn
cmVlbiwgYjogYmx1ZX07DQp9DQoNCmZ1bmN0aW9uIHJnYlRvSHN2KHJlZCwgZ3JlZW4sIGJsdWUp
DQp7DQogICAgdmFyIG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHJlZCwgZ3JlZW4pLCBibHVlKTsN
CiAgICB2YXIgbWluID0gTWF0aC5taW4oTWF0aC5taW4ocmVkLCBncmVlbiksIGJsdWUpOw0KICAg
IHZhciBodWU7DQogICAgdmFyIHNhdHVyYXRpb247DQogICAgdmFyIHZhbHVlID0gbWF4Ow0KICAg
IGlmIChtaW4gPT0gbWF4KQ0KICAgIHsNCiAgICAgICAgaHVlID0gMDsNCiAgICAgICAgc2F0dXJh
dGlvbiA9IDA7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBkZWx0YSA9ICht
YXggLSBtaW4pOw0KICAgICAgICBzYXR1cmF0aW9uID0gZGVsdGEgLyBtYXg7DQogICAgICAgIGlm
IChyZWQgPT0gbWF4KQ0KICAgICAgICB7DQogICAgICAgICAgICBodWUgPSAoZ3JlZW4gLSBibHVl
KSAvIGRlbHRhOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKGdyZWVuID09IG1heCkNCiAg
ICAgICAgew0KICAgICAgICAgICAgaHVlID0gMiArICgoYmx1ZSAtIHJlZCkgLyBkZWx0YSk7DQog
ICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBodWUgPSA0ICsg
KChyZWQgLSBncmVlbikgLyBkZWx0YSk7DQogICAgICAgIH0NCiAgICAgICAgaHVlIC89IDY7DQog
ICAgICAgIGlmIChodWUgPCAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBodWUgKz0gMTsNCiAg
ICAgICAgfQ0KICAgICAgICBpZiAoaHVlID4gMSkNCiAgICAgICAgew0KICAgICAgICAgICAgaHVl
IC09IDE7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHsNCiAgICAgICAgaDogaHVlLA0K
ICAgICAgICBzOiBzYXR1cmF0aW9uLA0KICAgICAgICB2OiB2YWx1ZQ0KICAgIH07DQp9DQoNCmZ1
bmN0aW9uIHBhZ2VDb29yZHMobm9kZSkNCnsNCiAgICB2YXIgeCA9IG5vZGUub2Zmc2V0TGVmdDsN
CiAgICB2YXIgeSA9IG5vZGUub2Zmc2V0VG9wOw0KICAgIHZhciBwYXJlbnQgPSBub2RlLm9mZnNl
dFBhcmVudDsNCiAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpDQogICAgew0KICAgICAgICB4ICs9
IHBhcmVudC5vZmZzZXRMZWZ0Ow0KICAgICAgICB5ICs9IHBhcmVudC5vZmZzZXRUb3A7DQogICAg
ICAgIHBhcmVudCA9IHBhcmVudC5vZmZzZXRQYXJlbnQ7DQogICAgfQ0KICAgIHJldHVybiB7eDog
eCwgeTogeX07DQp9DQoNCi8vIFRoZSByZWFsIGNvZGUgYmVnaW5zIGhlcmUuDQp2YXIgaHVlUG9z
aXRpb25JbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCmh1ZVBvc2l0aW9uSW1n
LmdhbGxlcnlJbWcgPSBmYWxzZTsNCmh1ZVBvc2l0aW9uSW1nLndpZHRoID0gMzU7DQpodWVQb3Np
dGlvbkltZy5oZWlnaHQgPSAxMTsNCmh1ZVBvc2l0aW9uSW1nLnNyYyA9IEhVRV9TTElERVJfQVJS
T1dTX0xPQ0FUSU9OOw0KaHVlUG9zaXRpb25JbWcuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUn
Ow0KDQp2YXIgaHVlU2VsZWN0b3JJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsN
Cmh1ZVNlbGVjdG9ySW1nLmdhbGxlcnlJbWcgPSBmYWxzZTsNCmh1ZVNlbGVjdG9ySW1nLndpZHRo
ID0gMzU7DQpodWVTZWxlY3RvckltZy5oZWlnaHQgPSAyMDA7DQpodWVTZWxlY3RvckltZy5zcmMg
PSBIVUVfU0xJREVSX0xPQ0FUSU9OOw0KaHVlU2VsZWN0b3JJbWcuc3R5bGUuZGlzcGxheSA9ICdi
bG9jayc7DQoNCnZhciBzYXRWYWxJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsN
CnNhdFZhbEltZy5nYWxsZXJ5SW1nID0gZmFsc2U7DQpzYXRWYWxJbWcud2lkdGggPSAyMDA7DQpz
YXRWYWxJbWcuaGVpZ2h0ID0gMjAwOw0Kc2F0VmFsSW1nLnNyYyA9IFNBVF9WQUxfU1FVQVJFX0xP
Q0FUSU9OOw0Kc2F0VmFsSW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KDQp2YXIgY3Jvc3NI
YWlyc0ltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOw0KY3Jvc3NIYWlyc0ltZy5n
YWxsZXJ5SW1nID0gZmFsc2U7DQpjcm9zc0hhaXJzSW1nLndpZHRoID0gMjE7DQpjcm9zc0hhaXJz
SW1nLmhlaWdodCA9IDIxOw0KY3Jvc3NIYWlyc0ltZy5zcmMgPSBDUk9TU0hBSVJTX0xPQ0FUSU9O
Ow0KY3Jvc3NIYWlyc0ltZy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQoNCmZ1bmN0aW9u
IG1ha2VDb2xvclNlbGVjdG9yKGlucHV0Qm94KQ0Kew0KICAgIHZhciByZ2IsIGhzdg0KICAgIA0K
ICAgIGZ1bmN0aW9uIGNvbG9yQ2hhbmdlZCgpDQogICAgew0KICAgICAgICB2YXIgaGV4ID0gcmdi
VG9IZXgocmdiLnIsIHJnYi5nLCByZ2IuYik7DQogICAgICAgIHZhciBodWVSZ2IgPSBoc3ZUb1Jn
Yihoc3YuaCwgMSwgMSk7DQogICAgICAgIHZhciBodWVIZXggPSByZ2JUb0hleChodWVSZ2Iuciwg
aHVlUmdiLmcsIGh1ZVJnYi5iKTsNCiAgICAgICAgcHJldmlld0Rpdi5zdHlsZS5iYWNrZ3JvdW5k
ID0gaGV4Ow0KICAgICAgICBpbnB1dEJveC52YWx1ZSA9IGhleDsNCiAgICAgICAgc2F0VmFsRGl2
LnN0eWxlLmJhY2tncm91bmQgPSBodWVIZXg7DQogICAgICAgIGNyb3NzSGFpcnMuc3R5bGUubGVm
dCA9ICgoaHN2LnYqMTk5KS0xMCkudG9TdHJpbmcoKSArICdweCc7DQogICAgICAgIGNyb3NzSGFp
cnMuc3R5bGUudG9wID0gKCgoMS1oc3YucykqMTk5KS0xMCkudG9TdHJpbmcoKSArICdweCc7DQog
ICAgICAgIGh1ZVBvcy5zdHlsZS50b3AgPSAoKGhzdi5oKjE5OSktNSkudG9TdHJpbmcoKSArICdw
eCc7DQogICAgfQ0KICAgIGZ1bmN0aW9uIHJnYkNoYW5nZWQoKQ0KICAgIHsNCiAgICAgICAgaHN2
ID0gcmdiVG9Ic3YocmdiLnIsIHJnYi5nLCByZ2IuYik7DQogICAgICAgIGNvbG9yQ2hhbmdlZCgp
Ow0KICAgIH0NCiAgICBmdW5jdGlvbiBoc3ZDaGFuZ2VkKCkNCiAgICB7DQogICAgICAgIHJnYiA9
IGhzdlRvUmdiKGhzdi5oLCBoc3YucywgaHN2LnYpOw0KICAgICAgICBjb2xvckNoYW5nZWQoKTsN
CiAgICB9DQogICAgDQogICAgdmFyIGNvbG9yU2VsZWN0b3JEaXYgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCdkaXYnKTsNCiAgICBjb2xvclNlbGVjdG9yRGl2LnN0eWxlLnBhZGRpbmcgPSAnMTVw
eCc7DQogICAgY29sb3JTZWxlY3RvckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQog
ICAgY29sb3JTZWxlY3RvckRpdi5zdHlsZS5oZWlnaHQgPSAnMjc1cHgnOw0KICAgIGNvbG9yU2Vs
ZWN0b3JEaXYuc3R5bGUud2lkdGggPSAnMjUwcHgnOw0KICAgIA0KICAgIHZhciBzYXRWYWxEaXYg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICBzYXRWYWxEaXYuc3R5bGUucG9z
aXRpb24gPSAncmVsYXRpdmUnOw0KICAgIHNhdFZhbERpdi5zdHlsZS53aWR0aCA9ICcyMDBweCc7
DQogICAgc2F0VmFsRGl2LnN0eWxlLmhlaWdodCA9ICcyMDBweCc7DQogICAgdmFyIG5ld1NhdFZh
bEltZyA9IGZpeFBORyhzYXRWYWxJbWcpOw0KICAgIHNhdFZhbERpdi5hcHBlbmRDaGlsZChuZXdT
YXRWYWxJbWcpOw0KICAgIHZhciBjcm9zc0hhaXJzID0gY3Jvc3NIYWlyc0ltZy5jbG9uZU5vZGUo
ZmFsc2UpOw0KICAgIHNhdFZhbERpdi5hcHBlbmRDaGlsZChjcm9zc0hhaXJzKTsNCiAgICBmdW5j
dGlvbiBzYXRWYWxEcmFnZ2VkKHgsIHkpDQogICAgew0KICAgICAgICBoc3YucyA9IDEtKHkvMTk5
KTsNCiAgICAgICAgaHN2LnYgPSAoeC8xOTkpOw0KICAgICAgICBoc3ZDaGFuZ2VkKCk7DQogICAg
fQ0KICAgIHRyYWNrRHJhZyhzYXRWYWxEaXYsIHNhdFZhbERyYWdnZWQpDQogICAgY29sb3JTZWxl
Y3RvckRpdi5hcHBlbmRDaGlsZChzYXRWYWxEaXYpOw0KDQogICAgdmFyIGh1ZURpdiA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgIGh1ZURpdi5zdHlsZS5wb3NpdGlvbiA9ICdh
YnNvbHV0ZSc7DQogICAgaHVlRGl2LnN0eWxlLmxlZnQgPSAnMjMwcHgnOw0KICAgIGh1ZURpdi5z
dHlsZS50b3AgPSAnMTVweCc7DQogICAgaHVlRGl2LnN0eWxlLndpZHRoID0gJzM1cHgnOw0KICAg
IGh1ZURpdi5zdHlsZS5oZWlnaHQgPSAnMjAwcHgnOw0KICAgIHZhciBodWVQb3MgPSBmaXhQTkco
aHVlUG9zaXRpb25JbWcpOw0KICAgIGh1ZURpdi5hcHBlbmRDaGlsZChodWVTZWxlY3RvckltZy5j
bG9uZU5vZGUoZmFsc2UpKTsNCiAgICBodWVEaXYuYXBwZW5kQ2hpbGQoaHVlUG9zKTsNCiAgICBm
dW5jdGlvbiBodWVEcmFnZ2VkKHgsIHkpDQogICAgew0KICAgICAgICBoc3YuaCA9IHkvMTk5Ow0K
ICAgICAgICBoc3ZDaGFuZ2VkKCk7DQogICAgfQ0KICAgIHRyYWNrRHJhZyhodWVEaXYsIGh1ZURy
YWdnZWQpOw0KICAgIGNvbG9yU2VsZWN0b3JEaXYuYXBwZW5kQ2hpbGQoaHVlRGl2KTsNCiAgICAN
CiAgICB2YXIgcHJldmlld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAg
IHByZXZpZXdEaXYuc3R5bGUuaGVpZ2h0ID0gJzUwcHgnDQogICAgcHJldmlld0Rpdi5zdHlsZS53
aWR0aCA9ICc1MHB4JzsNCiAgICBwcmV2aWV3RGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRl
JzsNCiAgICBwcmV2aWV3RGl2LnN0eWxlLnRvcCA9ICcyMjVweCc7DQogICAgcHJldmlld0Rpdi5z
dHlsZS5sZWZ0ID0gJzE1cHgnOw0KICAgIHByZXZpZXdEaXYuc3R5bGUuYm9yZGVyID0gJzFweCBz
b2xpZCBibGFjayc7DQogICAgY29sb3JTZWxlY3RvckRpdi5hcHBlbmRDaGlsZChwcmV2aWV3RGl2
KTsNCiAgICANCiAgICBmdW5jdGlvbiBpbnB1dEJveENoYW5nZWQoKQ0KICAgIHsNCiAgICAgICAg
cmdiID0gaGV4VG9SZ2IoaW5wdXRCb3gudmFsdWUsIHtyOiAwLCBnOiAwLCBiOiAwfSk7DQogICAg
ICAgIHJnYkNoYW5nZWQoKTsNCiAgICB9DQogICAgbXlBZGRFdmVudExpc3RlbmVyKGlucHV0Qm94
LCAnY2hhbmdlJywgaW5wdXRCb3hDaGFuZ2VkKTsNCiAgICBpbnB1dEJveC5zaXplID0gODsNCiAg
ICBpbnB1dEJveC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQogICAgaW5wdXRCb3guc3R5
bGUucmlnaHQgPSAnMTVweCc7DQogICAgaW5wdXRCb3guc3R5bGUudG9wID0gKDIyNSArICgyNSAt
IChpbnB1dEJveC5vZmZzZXRIZWlnaHQvMikpKS50b1N0cmluZygpICsgJ3B4JzsNCiAgICBjb2xv
clNlbGVjdG9yRGl2LmFwcGVuZENoaWxkKGlucHV0Qm94KTsNCiAgICANCiAgICBpbnB1dEJveENo
YW5nZWQoKTsNCiAgICANCiAgICByZXR1cm4gY29sb3JTZWxlY3RvckRpdjsNCn0NCg0KZnVuY3Rp
b24gbWFrZUNvbG9yU2VsZWN0b3JzKGV2KQ0Kew0KICAgIHZhciBpbnB1dE5vZGVzID0gZG9jdW1l
bnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7DQogICAgdmFyIGk7DQogICAgZm9yIChp
ID0gMDsgaSA8IGlucHV0Tm9kZXMubGVuZ3RoOyBpKyspDQogICAgew0KICAgICAgICB2YXIgbm9k
ZSA9IGlucHV0Tm9kZXNbaV07DQogICAgICAgIGlmIChub2RlLmNsYXNzTmFtZSAhPSAnY29sb3In
KQ0KICAgICAgICB7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICB2
YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOw0KICAgICAgICB2YXIgcHJldk5vZGUgPSBub2Rl
LnByZXZpb3VzU2libGluZzsNCiAgICAgICAgdmFyIHNlbGVjdG9yID0gbWFrZUNvbG9yU2VsZWN0
b3Iobm9kZSk7DQogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc2VsZWN0b3IsIChwcmV2Tm9k
ZSA/IHByZXZOb2RlLm5leHRTaWJsaW5nIDogbnVsbCkpOw0KICAgIH0NCn0NCg0KbXlBZGRFdmVu
dExpc3RlbmVyKHdpbmRvdywgJ2xvYWQnLCBtYWtlQ29sb3JTZWxlY3RvcnMpOw==';
			break;
			default :
			header('Content-type: text/JavaScript');
				$code = 'ZXZhbChmdW5jdGlvbihwLGEsYyxrLGUscil7ZT1mdW5jdGlvbihjKXtyZXR1cm4oYzxhPycnOmUo
cGFyc2VJbnQoYy9hKSkpKygoYz1jJWEpPjM1P1N0cmluZy5mcm9tQ2hhckNvZGUoYysyOSk6Yy50
b1N0cmluZygzNikpfTtpZighJycucmVwbGFjZSgvXi8sU3RyaW5nKSl7d2hpbGUoYy0tKXJbZShj
KV09a1tjXXx8ZShjKTtrPVtmdW5jdGlvbihlKXtyZXR1cm4gcltlXX1dO2U9ZnVuY3Rpb24oKXty
ZXR1cm4nXFx3Kyd9O2M9MX07d2hpbGUoYy0tKWlmKGtbY10pcD1wLnJlcGxhY2UobmV3IFJlZ0V4
cCgnXFxiJytlKGMpKydcXGInLCdnJyksa1tjXSk7cmV0dXJuIHB9KCczIHc9e307dy4xSz1LKGgp
ezMgZj1oLjFhfHxBOzMgYj1oLjFnfHxBOzMgZT1oLlB8fCIjMTUiOzMgYT1oLjEzfHwiI0ciOzMg
Zz1oLjIwfHwiIzFXIjszIGQ9Ik46Ly96LkwuUS5PL3o/Uj0xQiI7MyBqPWQrIiZVPSIrZisieCIr
YisiJlQ9IitnLjQoIiMiLCIiKSsiLCIrZS40KCIjIiwiIikrIiwiK2EuNCgiIyIsIiIpKyImRj0u
RSI7MyBjPXUgMTAoWSk7Yy5YPWo7Yy5WPXUgQihmLGIpO2MuMTk9dSBCKHkuMWUoZioxLjYpLGIp
O2MuMTQ9dSBIKGYvMixiKTtjLjE3PXUgSChmLzIseS4xZShiLzEyKSk7Yy4xOD1qKyImSj1JIjtj
LjFtPWorIiZEPVMscywxaCIrIiZKPUkiO2o9ZCsiJlU9IitmKyJ4IitiKyImVD0iK2cuNCgiIyIs
IiIpKyIsIitlLjQoIiMiLCIiKSsiLCIrYS40KCIjIiwiIik7Yy4xbD1qKyImRD1hLHMsMXAmRj0u
RSI7Yy52PVtmLzIsYiwoNy8xNikqZiwoNS84KSpiLCg1LzE2KSpmLCg3LzE2KSpiLCg3L0EpKmYs
KDUvMTYpKmIsKDUvMTYpKmYsKDEvOCkqYiwoMS8yKSpmLDAsKDExLzE2KSpmLCgxLzgpKmIsKDI1
L0EpKmYsKDUvMTYpKmIsKDExLzE2KSpmLCg3LzE2KSpiLCg5LzE2KSpmLCg1LzgpKmJdOzFrKDMg
aT0wO2k8Yy52LjFaO2krKyl7Yy52W2ldPVooYy52W2ldKX1DIGN9O3cuMVY9SyhrKXszIGg9ay4x
YXx8QTszIGo9ay4xZ3x8QTszIGQ9ay5QfHwiIzE1IjszIGk9ay4xVHx8IiNHIjszIG09dy5XKGsu
MWopfHwiIjszIGM9ay4xaXx8IiNHIjszIGw9ay4xU3x8MDszIHM9ay4xUnx8IjFmIjszIGY9KHM9
PT0iMWYiKT8iMVEiOiIxZCI7MyB0PSJOOi8vei5MLlEuTy96P1I9IitmOzMgbj10KyImVT0iK2gr
IngiK2orIiZUPSIrZC40KCIjIiwiIikrIiwiK2kuNCgiIyIsIiIpKyIxUCwxYyIrIiYxYj0iK20r
IiYxTz0iK2MuNCgiIyIsIiIpKyIsIitsOzMgZT11IDEwKFkpO2UuWD1uKyImRD1TLHMsMU0iKyIm
Rj0uRSI7ZS5WPXUgQihoLGopO2UuMTk9dSBCKDAsMCk7ZS4xND11IEgoaC8yLGovMik7ZS4xNz11
IEgoaC8yLGovMik7ZS4xOD1uKyImSj1JIjtlLjFtPW4rIiZEPVMscywxaCIrIiZKPUkiO2UuMWw9
bisiJkQ9YSxzLDFjJkY9LkUiO2Uudj1bXTtNKGY9PT0iMWQiKXtlLnY9WzAsMCxoLDAsaCxqLDAs
al19MUp7MyBvPTg7MyByPTFJL287MyBiPXkuMUgoaCxqKS8yOzFrKDMgYT0wO2E8KG8rMSk7YSsr
KXszIGc9ciphKih5LjFHLzFGKTszIHA9YitiKnkuMUUoZyk7MyBxPWIrYip5LjFEKGcpO2Uudi4x
QShaKHApLFoocSkpfX1DIGV9O3cuMUw9SyhrKXszIGo9ay5QfHwiIzF6IjszIGI9ay4xM3x8IiNH
IjszIGY9ay4xTnx8IiMxeSI7MyBhPWsuMXh8fCIjMXciOzMgZT13Llcoay4xail8fCIiOzMgZD1r
LjFpfHwiI0ciOzMgaT1rLjF2fHwxdTszIGM9KGkpPyIxdCI6IjFzIjszIGg9Ik46Ly96LkwuUS5P
L3o/Uj1kJjFVPTFyJjFiPSI7MyBsPWgrYysiXCdpXFxcXCIrIlwnWyIrZSsiXCctMlwnZlxcXFwi
KyIxcVwnYVxcXFxdIisiaFxcXFxdb1xcXFwiK2ouNCgiIyIsIiIpKyJcJzFYXFxcXCIrZC40KCIj
IiwiIikrIlwnMVlcXFxcIitiLjQoIiMiLCIiKSsiXCcxb1xcXFwiO00oaSl7bCs9Zi40KCIjIiwi
IikrIlwnMUNcXFxcIithLjQoIiMiLCIiKSsiXCcxblxcXFwifWwrPSIyMlwnZlxcXFwiOzMgZz11
IDEwKFkpO2cuWD1sKyImRj0uRSI7Zy5WPShpKT91IEIoMjMsMjkpOnUgQigyMSwyOCk7QyBnfTt3
Llc9SyhhKXtNKGE9PT0yNyl7QyAyNn1hPWEuNCgvQC8sIkBAIik7YT1hLjQoL1xcXFwvLCJAXFxc
XCIpO2E9YS40KC9cJy8sIkBcJyIpO2E9YS40KC9cXFsvLCJAWyIpO2E9YS40KC9cXF0vLCJAXSIp
O0MgMjQoYSl9OycsNjIsMTM0LCd8fHx2YXJ8cmVwbGFjZXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8
fHx8bmV3fGltYWdlTWFwfE1hcEljb25NYWtlcnx8TWF0aHxjaGFydHwzMnxHU2l6ZXxyZXR1cm58
Y2hmfHBuZ3xleHR8MDAwMDAwfEdQb2ludHxnaWZ8Y2hvZnxmdW5jdGlvbnxhcGlzfGlmfGh0dHB8
Y29tfHByaW1hcnlDb2xvcnxnb29nbGV8Y2h0fGJnfGNoY298Y2hzfGljb25TaXplfGVzY2FwZVVz
ZXJUZXh0X3xpbWFnZXxHX0RFRkFVTFRfSUNPTnxwYXJzZUludHxHSWNvbnx8fHN0cm9rZUNvbG9y
fGljb25BbmNob3J8ZmYwMDAwfHxpbmZvV2luZG93QW5jaG9yfHByaW50SW1hZ2V8c2hhZG93U2l6
ZXx3aWR0aHxjaGx8ZmZmZmZmMDF8aXRyfGZsb29yfGNpcmNsZXxoZWlnaHR8RUNFQ0Q4fGxhYmVs
Q29sb3J8bGFiZWx8Zm9yfHRyYW5zcGFyZW50fG1velByaW50SW1hZ2V8MEN8ZUN8ZmZmZmZmMTF8
aHZ8bWFwc2FwaXxwaW58cGluX3N0YXJ8ZmFsc2V8YWRkU3RhcnwwMDAwRkZ8c3RhclN0cm9rZUNv
bG9yfEZGRkYwMHxEQTcxODd8cHVzaHxtbXx8c2lufGNvc3wxODB8UEl8bWlufDM2MHxlbHNlfGNy
ZWF0ZU1hcmtlckljb258Y3JlYXRlTGFiZWxlZE1hcmtlckljb258MDAwMDAwMDB8c3RhclByaW1h
cnlDb2xvcnxjaHh8ZmZ8aXR8c2hhcGV8bGFiZWxTaXplfHNoYWRvd0NvbG9yfGNoZHB8Y3JlYXRl
RmxhdEljb258ZmZmZmZmfGZDfHRDfGxlbmd0aHxjb3JuZXJDb2xvcnx8TGF1dG98fGVuY29kZVVS
SUNvbXBvbmVudHx8bnVsbHx1bmRlZmluZWR8MzR8MzknLnNwbGl0KCd8JyksMCx7fSkp';
}
		echo base64_decode($code);
		exit();
		}
# --- END PLUGIN CODE ---
if (0) {
?>
<!--
# --- BEGIN PLUGIN HELP ---
<h1>Article Map</h1>

	<p>This plugin will add a google map to your article tab to assist you with adding lat/lng coordinates to the 2 custom fields. Just click on the desired point on the map to set the location or enter an address in the address field.</p>

	<p>You must set the Google Maps api key for your domain in the Article Location tab where you can change other options as well. A api key can be obtained at <a href="http://code.google.com/apis/maps/signup.html">Google Maps</a></p>
# --- END PLUGIN HELP ---
-->
<?php
}
?>
